#include <rtthread.h>
#include "boot_api.h"
#include "config_boot.h"

uboot_cfg_t uboot_cfg = {0};

void uc_boot_cfg_default(void)
{
    uboot_cfg_t uboot_cfg_par = {0};
    uboot_cfg_par.ymode_wait_time = BOOT_YMODE_WAIT_TIME;
    rt_memcpy(&uboot_cfg, &uboot_cfg_par, sizeof(uboot_cfg_t));
}

int uc_boot_cfg_init(void)
{
    if (get_boot_param(&uboot_cfg))
    {
        uc_boot_cfg_default();
        set_boot_param(&uboot_cfg);
    }
    return 0;
}

int uc_boot_cfg_save(void)
{
    set_boot_param(&uboot_cfg);
    return 0;
}

void uc_boot_cfg_reset(void)
{
    uc_boot_cfg_default();
    uc_boot_cfg_save();
}

uboot_cfg_t *uc_get_uboot_cfg(void)
{
    return &uboot_cfg;
}

void uc_set_uboot_cfg(uboot_cfg_t *uboot_cfg)
{
    rt_memcpy(uc_get_uboot_cfg(), uboot_cfg, sizeof(uboot_cfg_t));
}

/**
 * @brief 获取ymodem升级的uart口
 *
 */
void uc_get_ym_uart(char *name)
{
    rt_memcpy(name, uboot_cfg.ymode_uart, sizeof(uboot_cfg.ymode_uart));
}

/**
 * @brief 设置ymodem升级的uart口
 *
 */
void uc_set_ym_uart(char *name)
{
    rt_memset(uboot_cfg.ymode_uart, 0, sizeof(uboot_cfg.ymode_uart));
    rt_memcpy(uboot_cfg.ymode_uart, name, rt_strlen(name));
}

/**
 * @brief 获取ymodem等待时间.单位S.
 *
 */
unsigned char uc_get_ym_time(void)
{
    return uboot_cfg.ymode_wait_time;
}

/**
 * @brief 设置ymodem等待时间.单位S.
 *
 */
void uc_set_ym_time(unsigned char ymode_wait_time)
{
    uboot_cfg.ymode_wait_time = ymode_wait_time;
}

/**
 * @brief 获取uboot工作模式
 *
 */
uc_uboot_work_e uc_get_uboot_mode(void)
{
    return uboot_cfg.uboot_mode;
}

/**
 * @brief 设置uboot工作模式
 *
 */
void uc_set_uboot_mode(uc_uboot_work_e mode)
{
    uboot_cfg.uboot_mode = mode;
}

/**
 * @brief 获取升级包文件名字和大小
 *
 */
void uc_get_file_params(unsigned int *file_size)
{
    if (file_size != NULL)
    {
        *file_size = uboot_cfg.ota_size;
    }
}
/**
 * @brief 设置升级包文件名字和大小
 *
 */
void uc_set_file_params(unsigned int file_size)
{
    uboot_cfg.ota_size = file_size;
}

/**
 * @brief 获取OTA升级状态
 *
 */
uc_ota_state_e uc_get_ota_state(void)
{
    return uboot_cfg.ota_state;
}

/**
 * @brief 设置OTA升级状态
 *
 */
void uc_set_ota_state(uc_ota_state_e state)
{
    uboot_cfg.ota_state = state;
}